= 70) return ['grade' => 'A', 'class' => 'grade-A'];
elseif ($score >= 60) return ['grade' => 'B', 'class' => 'grade-B'];
elseif ($score >= 55) return ['grade' => 'C', 'class' => 'grade-C'];
elseif ($score >= 50) return ['grade' => 'D', 'class' => 'grade-D'];
else return ['grade' => 'F', 'class' => 'grade-F'];
}
// Function to abbreviate subject name
function abbreviateSubject($subject) {
// Take first 3 letters, uppercase
$abbrev = strtoupper(substr(trim($subject), 0, 3));
// Special cases for common subjects
$special_cases = [
'MATHEMATICS' => 'MAT',
'ENGLISH' => 'ENG',
'PHYSICS' => 'PHY',
'CHEMISTRY' => 'CHE',
'BIOLOGY' => 'BIO',
'GEOGRAPHY' => 'GEO',
'HISTORY' => 'HIS',
'LITERATURE' => 'LIT',
'ECONOMICS' => 'ECO',
'ACCOUNTING' => 'ACC',
'COMMERCE' => 'COM',
'GOVERNMENT' => 'GOV',
'CRS' => 'CRS',
'IRS' => 'IRS',
'FRENCH' => 'FRE',
'AGRICULTURE' => 'AGR',
'COMPUTER' => 'COM',
'TECHNICAL' => 'TEC',
'PHYSICAL' => 'PE',
'CIVIC' => 'CIV',
'SOCIAL' => 'SOC',
];
$subject_upper = strtoupper(trim($subject));
foreach ($special_cases as $full => $abbr) {
if (strpos($subject_upper, $full) === 0) {
return $abbr;
}
}
return $abbrev;
}
if(isset($_POST['filter'])) {
$acyear = $_POST['acyear'];
$term = $_POST['term'];
$klass = $_POST['klass'];
try {
// Get students with names from students_info table
$students_query = "SELECT DISTINCT m.regno, s.fullname
FROM marks m
LEFT JOIN students_info s ON m.regno = s.regno
WHERE m.acyear = ?
AND m.term = ?
AND m.klass = ?
ORDER BY s.fullname";
$students_stmt = $DBcon->prepare($students_query);
$students_stmt->execute([$acyear, $term, $klass]);
$students = $students_stmt->fetchAll(PDO::FETCH_ASSOC);
// Get subjects
$subjects_query = "SELECT DISTINCT subject FROM marks
WHERE acyear = ?
AND term = ?
AND klass = ?
ORDER BY subject";
$subjects_stmt = $DBcon->prepare($subjects_query);
$subjects_stmt->execute([$acyear, $term, $klass]);
$subjects = $subjects_stmt->fetchAll(PDO::FETCH_ASSOC);
if(count($students) > 0 && count($subjects) > 0) {
$total_subjects = count($subjects);
// Calculate totals and averages for all students first
$student_data = [];
foreach($students as $student) {
$regno = $student['regno'];
$total_score = 0;
// Calculate total score for this student across ALL subjects
foreach($subjects as $subject) {
$mark_query = $DBcon->prepare("SELECT test, exam FROM marks WHERE regno = ? AND subject = ? AND acyear = ? AND term = ? AND klass = ?");
$mark_query->execute([$regno, $subject['subject'], $acyear, $term, $klass]);
$mark = $mark_query->fetch(PDO::FETCH_ASSOC);
if($mark) {
$total_score += $mark['test'] + $mark['exam'];
}
}
// Calculate average based on total number of subjects offered by class
$average = $total_subjects > 0 ? $total_score / $total_subjects : 0;
$student_data[] = [
'regno' => $regno,
'fullname' => $student['fullname'],
'total_score' => $total_score,
'average' => $average
];
}
// Sort students by average (descending) for position
usort($student_data, function($a, $b) {
return $b['average'] <=> $a['average'];
});
// Assign positions (handle ties)
$student_positions = [];
$current_position = 1;
$previous_average = null;
foreach($student_data as $index => $student) {
if($previous_average !== null && $student['average'] < $previous_average) {
$current_position = $index + 1;
}
$student_positions[$student['regno']] = $current_position;
$previous_average = $student['average'];
}
?>
Class Result Sheet
Print Result (A4 Landscape)
Academic Year
Term
Class
Students
Subjects: | A4 Landscape Format | Subject codes shown
T
E
TOT
prepare($students_query);
$students_display->execute([$acyear, $term, $klass]);
$students_for_display = $students_display->fetchAll(PDO::FETCH_ASSOC);
foreach($students_for_display as $student):
$regno = $student['regno'];
$position = $student_positions[$regno] ?? '-';
$position_class = '';
if($position == 1) $position_class = 'position-1';
elseif($position == 2) $position_class = 'position-2';
elseif($position == 3) $position_class = 'position-3';
// Calculate this student's total for display
$student_total = 0;
foreach($subjects as $subject) {
$mark_query = $DBcon->prepare("SELECT test, exam FROM marks WHERE regno = ? AND subject = ? AND acyear = ? AND term = ? AND klass = ?");
$mark_query->execute([$regno, $subject['subject'], $acyear, $term, $klass]);
$mark = $mark_query->fetch(PDO::FETCH_ASSOC);
if($mark) {
$student_total += $mark['test'] + $mark['exam'];
}
}
// Get the pre-calculated average
$student_average = 0;
foreach($student_data as $data) {
if($data['regno'] == $regno) {
$student_average = $data['average'];
break;
}
}
// Get overall grade
$overall_grade_info = getGrade($student_average);
$overall_grade = $overall_grade_info['grade'];
$overall_grade_class = $overall_grade_info['class'];
?>
20) {
echo substr($name, 0, 18) . '...';
} else {
echo $name;
}
?>
prepare("SELECT test, exam FROM marks WHERE regno = ? AND subject = ? AND acyear = ? AND term = ? AND klass = ?");
$mark_query->execute([$regno, $subject['subject'], $acyear, $term, $klass]);
$mark = $mark_query->fetch(PDO::FETCH_ASSOC);
if($mark):
$test = $mark['test'];
$exam = $mark['exam'];
$subject_total = $test + $exam;
?>
-
-
-
_________________________
Class Teacher
_________________________
Principal
_________________________
Date:
Subject Codes:
8) {
echo ' | ... (' . count($subjects) . ' subjects)';
}
?>
No results found for the selected criteria.
Database error: ' . htmlspecialchars($e->getMessage()) . '